using System;
using System.Drawing;
using System.Windows.Forms;
using FreeImageAPI;
using System.Drawing.Imaging;

namespace Sample06
{
    public partial class MainForm : Form
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new MainForm());
        }

        public MainForm()
        {
            InitializeComponent();
        }

        private void bExample01_Click(object sender, EventArgs e)
        {
            // Load bitmap
            FIBITMAP dib = FreeImage.LoadEx("Sample.jpg");

            // Check success
            if (dib.IsNull)
            {
                MessageBox.Show("Could not load Sample.jpg", "Error");
                return;
            }

            // Check whether bitmap is 24-bit
            if (FreeImage.GetBPP(dib) != 24)
            {
                MessageBox.Show("Sample.jpg is not 24-bit.", "Error");
                FreeImage.UnloadEx(ref dib);
                return;
            }

            // Convert the 24-bit bitmap to 8-bit and forcing the result will be greyscale
            dib = FreeImage.ConvertColorDepth(dib, FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP | FREE_IMAGE_COLOR_DEPTH.FICD_FORCE_GREYSCALE, true);

            if (FreeImage.GetBPP(dib) == 8)
            {
                // Convert the FreeImage-Bitmap into a .NET bitmap
                Bitmap bitmap = FreeImage.GetBitmap(dib);

                // Dispose the bitmap of the pictureBox
                if (picBox.Image != null)
                {
                    picBox.Image.Dispose();
                }

                // Assign the bitmap to the picturebox
                picBox.Image = bitmap;
            }

            // Unload source bitmap
            FreeImage.UnloadEx(ref dib);
        }

        private void bOriginal_Click(object sender, EventArgs e)
        {
            // Load bitmap
            FIBITMAP dib = FreeImage.LoadEx("Sample.jpg");

            // Check success
            if (dib.IsNull)
            {
                MessageBox.Show("Could not load Sample.jpg", "Error");
                return;
            }

            // Convert the FreeImage-Bitmap into a .NET bitmap
            Bitmap bitmap = FreeImage.GetBitmap(dib);

            // Check success
            if (bitmap != null)
            {
                // Dispose old bitmap
                if (picBox.Image != null)
                {
                    picBox.Image.Dispose();
                }

                // Assign new bitmap
                picBox.Image = bitmap;
            }

            // Unload bitmap
            FreeImage.UnloadEx(ref dib);
        }

        private void bExample02_Click(object sender, EventArgs e)
        {
            FIBITMAP dib = FreeImage.LoadEx("Sample.jpg");

            // Check success
            if (dib.IsNull)
            {
                MessageBox.Show("Could not load Sample.jpg", "Error");
                return;
            }

            // Convert bitmap to 8 bit
            dib = FreeImage.ConvertColorDepth(dib, FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP, true);

            // Check whether conversion succeeded
            if (FreeImage.GetBPP(dib) != 8)
            {
                MessageBox.Show("Converting Sample.jpg to 8-bit failed.", "Error");
                FreeImage.UnloadEx(ref dib);
                return;
            }

            // Convert the FreeImage-Bitmap into a .NET bitmap
            Bitmap bitmap = FreeImage.GetBitmap(dib);

            // Dispose old bitmap
            if (picBox.Image != null)
            {
                picBox.Image.Dispose();
            }

            // Assign new bitmap
            picBox.Image = bitmap;

            // Unload bitmap
            FreeImage.UnloadEx(ref dib);
        }

        private void bExample03_Click(object sender, EventArgs e)
        {
            // Load bitmap
            Bitmap bitmap = (Bitmap)Bitmap.FromFile("Sample.jpg");

            // Convert the .NET bitmap into a FreeImage-Bitmap
            FIBITMAP dib = FreeImage.CreateFromBitmap(bitmap);

            // Unload bitmap
            bitmap.Dispose();

            // Rescale the bitmap
            FIBITMAP temp = FreeImage.Rescale(dib, 300, 300, FREE_IMAGE_FILTER.FILTER_BICUBIC);

            // Unload bitmap
            FreeImage.UnloadEx(ref dib);

            Random rand = new Random();

            // Rotate the bitmap
            dib = FreeImage.Rotate(temp, rand.NextDouble() * 360d);

            // Unload bitmap
            FreeImage.UnloadEx(ref temp);

            // Convert the FreeImage-Bitmap into a .NET bitmap
            bitmap = FreeImage.GetBitmap(dib);

            // Unload bitmap
            FreeImage.UnloadEx(ref dib);

            // Unload bitmap
            if (picBox.Image != null)
            {
                picBox.Image.Dispose();
            }

            // Assign new bitmap
            picBox.Image = bitmap;
        }
    }
}